Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Запрос с большим количеством неравнозначных условий (phoenix)
Author Message
phoenix
Участник форума



Joined: 06 Feb 2007
Posts: 53
Карма: 0
   поощрить/наказать


PostPosted: Sun May 20, 2007 10:43 am (написано за 7 минут 55 секунд)
   Post subject: Запрос с большим количеством неравнозначных условий
Reply with quote

Описываю ситуацию.
Есть интернет-магазин, и нужно организовать такую вещь - на странице конкретного товара нужно вывести похожие товары (характеристики - цена, цвет, бренд, ну не суть). Характеристики различаются по важности. Количество похожих товаров на вывод задано, и всегда нужно заполнять это количество полностью.

Подскажите, как лучше всего реализовать запрос?

У меня мысли крутятся только вокруг пути тупо сделать по выборке для каждого параметра, и потом скриптом раскидать по местам.
Back to top
View user's profile Send private message
Михаил Саяпин
Участник форума



Joined: 07 Apr 2007
Posts: 46
Карма: 15
   поощрить/наказать

Location: Санкт-Петербург

PostPosted: Sun May 20, 2007 12:18 pm (спустя 1 час 34 минуты; написано за 5 минут 24 секунды)
   Post subject:
Reply with quote

Здравствуйте,

А каким образом хранятся характеристики? Если просто полями, то только построением большого запроса (можно методами РНР), что эффективнее, либо переработкой полученных данных от БД, что проще (но если товаров будет 50000?).

Как я вижу построение методами РНР? Примерно так:
Code (php): скопировать код в буфер обмена
<?php
       
        //
        //

        define (www.php.net/define)('SHOW_PRODUCTS', 5);
       
        $goods_characteristics = array (www.php.net/array)(
                'price' => array (www.php.net/array)('weight' => 10, 'query' => "1 - (ABS(price - {$price}) / (SELECT MAX(price) - MIN(price) FROM products))"),
                'brand' => array (www.php.net/array)('weight' => 5'query' => "if(brand = {$brand}, 1, 0)"),
                ...
        );

        $sql_selects = array (www.php.net/array)();
        $sql_order_by = array (www.php.net/array)();
        foreach ($goods_characteristics as $name => $characteristic) {
                $sql_selects[] = '(' . $characteristic['query'] . ') * ' . $characteristic['weight'] . ' as ' . $name . '_def';
                $sql_order_by[] = $name . '_def';
        }

        $query = 'SELECT id, ' . join (www.php.net/join)(', ', $sql_selects) .
                ' FROM products WHERE id <> ' . $id .
                ' ORDER BY (' . join (www.php.net/join)(' + ', $sql_order_by) . ') DESC LIMIT ' . SHOW_PRODUCTS;

?>
Сгенерируется примерно такой запрос:
Code (SQL): скопировать код в буфер обмена
SELECT
        id,
        (1 - abs(price - 1000) / (SELECT max(price)-min(price) FROM products) * 10 AS price_def,
        (IF(brand = 3, 1, 0)) * 5 AS brand_def
FROM products
WHERE id <> 3
ORDER BY (price_def + brand_def) DESC
LIMIT 5
Но вообще решение тоже далеко не идеал. :( Передо мной тоже скоро встанет такая задача, только характеристики намного больше и логика намного сложнее (не цифровая), я планирую попробовать хитрости PostgreSQL: hstore.
Back to top
View user's profile Send private message
WK
Guest





Карма: 388
   поощрить/наказать


PostPosted: Wed Jun 20, 2007 6:52 am (спустя 30 дней 18 часов 33 минуты; написано за 1 минуту 57 секунд)
   Post subject: Запрос с большим количеством неравнозначных условий
Reply with quote

Quote:
Если просто полями, то только построением большого запроса (можно методами РНР), что эффективнее, либо переработкой полученных данных от БД, что проще (но если товаров будет 50000?).
А действительно что эффективнее с точки зрения производительности: построение большого запроса с кучей AND и OR, LEFT JOIN, UNION и т.п. или выборка всей информации, касаемой определенного объекта, и потом работа с коллекцией объектов?
Back to top
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Wed Jun 20, 2007 2:59 pm (спустя 8 часов 7 минут; написано за 2 минуты 34 секунды)
   Post subject:
Reply with quote

WK wrote:
или выборка всей информации, касаемой определенного объекта, и потом работа с коллекцией объектов?
Зависит от ситуации - тут нужно учитывать трафик (между СУБД и PHP) и расход памяти.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML